//给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 
//
// 请你返回该链表所表示数字的 十进制值 。 
//
// 最高位 在链表的头部。 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入：head = [1,0,1]
//输出：5
//解释：二进制数 (101) 转化为十进制数 (5)
// 
//
// 示例 2： 
//
// 
//输入：head = [0]
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// 链表不为空。 
// 链表的结点总数不超过 30。 
// 每个结点的值不是 0 就是 1。 
// 
//
// Related Topics 链表 数学 👍 192 👎 0


package LeetCode.editor.cn;


/**
 * @author ldltd
 * @date 2025-07-14 19:31:47
 * @description 1290.二进制链表转整数
 */

public class ConvertBinaryNumberInALinkedListToInteger {
    public static void main(String[] args) {
        //测试代码
        ConvertBinaryNumberInALinkedListToInteger fun = new ConvertBinaryNumberInALinkedListToInteger();
        Solution solution = fun.new Solution();

    }

//leetcode submit region begin(Prohibit modification and deletion)

    //  Definition for singly-linked list.
    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    class Solution {
        public int getDecimalValue(ListNode head) {
            // 初始化结果为第一个节点的值（只取最低位）
            // 使用位与操作确保只取最低位（防御性编程）
            int result = head.val & 1;
            // 遍历链表后续节点
            while (head.next != null) {
                // 移动到下一个节点
                head = head.next;
                // 获取当前节点的值（确保只取0或1）
                int val = head.val & 1;
                // 将已有结果左移一位（相当于乘以2）
                // 为新的二进制位腾出空间
                result <<= 1;
                // 加上当前节点的值（新的最低位）
                result += val;
            }
            return result;
        }
    }

//leetcode submit region end(Prohibit modification and deletion)

}
